package Day_0226.FactoryPattern;

/**
 * @author zxc
 * @date 2023/02/26 20:08
 **/
public class FactoryMethodPattern {
    public static void main(String[] args) {
        /**
         * 谈一谈对于工厂方法模式的理解
         * ===》
         * 1.工厂方法模式的定义
         * （1）工厂方法模式Factory Method，又称多态性工厂模式。
         * （2）在工厂方法模式中，核心的工厂类不再负责所有的产品的创建，而是将具体创建的工作交给子类去做。
         * （3）该核心类成为一个抽象工厂角色，仅负责给出具体工厂子类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节
         * ===》
         * 总结 ：
         * （1）首先，工厂接口，是需要所有产品类去继承的接口;
         * （2）工厂方法接口，不负责所有产品类实例的创建，
         *  而是仅仅只是定义 创建对象的方法，其需要所有具体产品工厂类去继承该工厂方法接口;
         * （3）某个产品类实例的创建，是需要调用该产品工厂类中创建产品类对象的方法;
         *
         * 2.工厂方法模式 ：
         * ===》
         * （1）工厂方法模式，是需要给每一个具体产品类都增加 具体产品工厂类;
         * （2）每个具体产品类，都需要继承某个抽象产品接口;
         * （3）每个具体产品工厂类，也是需要继承某个抽象产品工厂接口;
         *
         */
        // （1）即，首先创建 实现了核心工厂类接口（其中定义了创建对象的方法）的具体产品工厂类;
        // （2）通过实例化的具体产品工厂类，来调用 具体产品工厂类中创建对象的方法;
        Car1 aodi = new AoDiFactory().createCar();
        Car1 jili = new BmwFactory().createCar();
        aodi.run();
        jili.run();
    }
}
// 1. 产品类所需要实现的接口
interface Car1 {
    public void run();
}
// 3.产品工厂方法接口
interface CarFactory1 {
    Car1 createCar();
}
// 3.具体产品实现类
class AoDi1 implements Car1 {
    public void run() {
        System.out.println("我是奥迪汽车1..");
    }
}
class Bmw1 implements Car1 {
    public void run() {
        System.out.println("我是宝马汽车1...");
    }
}
// 3.某个具体产品的产品工厂类（实现了 产品工厂方法接口）
class AoDiFactory implements CarFactory1 {
    public Car1 createCar() {
        return new AoDi1();
    }
}
class BmwFactory implements CarFactory1 {
    public Car1 createCar() {
        return new Bmw1();
    }
}